<?php
require "./function.php";
/**
 * @Author: Wherein
 * @Date: 2021-03-24 16:49
 * @Descripttion: 原型模式
 * @example 书的分类有很多, 适合个人的,适合团队的. 适合个人的可能会有不同的读者, 适合团队的可能也会有不同的读者
 */

/**
 * 书的抽象原型类
 *
 * @date 2021-03-24 21:03
 */
abstract class BookPrototype
{
    private $title;
    private $category;

    abstract public function __clone();
}

/**
 * 类型书籍
 * @date 2021-03-24 21:06
 */
class CategoryBookPrototype extends BookPrototype
{
    protected $byOne; // 个人
    protected $byTeam; // 团队

    protected $reader;

    public function __clone()
    {
        $this->reader = clone $this->reader;
    }

    public function setByOne($param)
    {
        $this->byOne = $param;
    }
    public function setByTeam($param)
    {
        $this->byTeam = $param;
    }
    public function setReader($param)
    {
        $this->reader = $param;
    }
}

// 不同的读者  一千个读者眼中就会有一千个哈姆雷特
class Reader
{
    public function think(){}
}


// 创建一个原型模式
$prototype = new CategoryBookPrototype();

$prototype->setByOne('个人');
$prototype->setByTeam('团队');
$prototype->setReader(new Reader());

// 创建一个新的分类书籍--直接克隆
$new_prototype = clone $prototype;

dd($prototype, $new_prototype);